# -*- coding: utf-8 -*-
import scrapy
import datetime
from http import cookiejar  # 该模块继承自内置的http.cookiejar,操作类似
from selenium import webdriver
from urllib import request


# cookie_jar = CookieJar()


class Vip818tuSpider(scrapy.Spider):
    name = 'vip.818tu'
    allowed_domains = ['vip.818tu']
    start_urls = ['http://https://vip.818tu.com/login/']
    login_url = 'https://vip.818tu.com/login/dologin'

    # 根据浏览器Network返回值来构造header，这是比较简单的header，复杂的还会有很多信息
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36",
        "HOST": "vip.818tu.com",
        "Content-Type": "application/x-www-form-urlencoded",
    }

    def parse(self, response):
        body = response.body.decode('utf-8')
        # open('body.html', 'w').write(body)
        print(body)
        pass

    # 爬虫运行的起始位置
    # 第一步：爬登录页面
    def start_requests(self):
        print("爬虫运行的起始位置")
        # 马蜂窝登录页面
        login_url = "https://vip.818tu.com/login"

        loginIndexReq = scrapy.Request(
            url=login_url,
            headers=self.header,
            callback=self.parseLoginPage,
            dont_filter=True,  # 防止页面因为重复爬取，被过滤了
        )
        yield loginIndexReq

    # 第二步：分析登录页面，取出必要的参数，然后发起登录请求POST
    def parseLoginPage(self, response):
        print(f"登录请求分析地址: url = {response.url}")
        # 如果这个登录页面含有一些登录必备的信息，那么就在这个函数里面进行信息提取( response.text )

        loginPostUrl = "https://vip.818tu.com/login/dologin"
        # FormRequest 是Scrapy发送POST请求的方法
        yield scrapy.FormRequest(
            url=loginPostUrl,
            headers=self.header,
            method="POST",
            # post的具体数据
            formdata={
                'name': '324cq',
                'password': 'hy123456',
                'csessionid': '',
                'sig': '',
                'token': '',
                'scene': ''
            },
            callback=self.loginResParse,
            dont_filter=True,
        )

    # 第三步：分析登录结果，然后发起登录状态的验证请求
    def loginResParse(self, response):
        print(f"分析登录: url = {response.url}")
        # 通过访问个人中心页面的返回状态码来判断是否为登录状态
        # 这个页面，只有登录过的用户，才能访问。否则会被重定向(302) 到登录页面
        routeUrl = "https://vip.818tu.com/backend/stats/orders"
        # 下面有两个关键点
        # 第一个是header，如果不设置，会返回500的错误
        # 第二个是dont_redirect，设置为True时，是不允许重定向，用户处于非登录状态时，是无法进入这个页面的，服务器返回302错误。
        #       dont_redirect，如果设置为False，允许重定向，进入这个页面时，会自动跳转到登录页面。会把登录页面抓下来。返回200的状态码
        yield scrapy.Request(
            url=routeUrl,
            headers=self.header,
            meta={
                'dont_redirect': True,  # 禁止网页重定向302, 如果设置这个，但是页面又一定要跳转，那么爬虫会异常
                # 'handle_httpstatus_list': [301, 302]      # 对哪些异常返回进行处理
            },
            callback=self.parse,
            dont_filter=True,  # 防止页面因为重复爬取，被过滤了
        )

    # 第五步:分析用户的登录状态, 如果登录成功，那么接着爬取其他页面
    # 如果登录失败，爬虫会直接终止。
    def isLoginStatusParse(self, response):
        print(f"分析用户的登录状态: url = {response.url}")
        # 如果能进到这一步，都没有出错的话，那么后面就可以用登录状态，访问后面的页面了
        # ………………………………
        # 不需要存储cookie
        # 其他网页爬取
        # ………………………………#
        # 如果不指定callback，那么默认会使用parse函数
        yield scrapy.Request(url="https://vip.818tu.com/backend/stats/orders", headers=self.header, callback=self.parse)

    # 请求错误处理：可以打印，写文件，或者写到数据库中
    def errorHandle(self, failure):
        print(f"请求错误: {failure.value.response}")

    # 爬虫运行完毕时的收尾工作，例如：可以打印信息，可以发送邮件
    def closed(self, reason):
        # 爬取结束的时候可以发送邮件
        finishTime = datetime.datetime.now()
        subject = f"爬虫运行完毕时的收尾工作, reason = {reason}, finishedTime = {finishTime}"

    # 将cookie保存到文本文件中



